iOS Core Animation初学

这篇文章是在初学 Core Animation 的时候记录的。主要是为了之后的回顾

  1. 动画

    • 直接动画
  • 1
    2
    UIView.animateWithDuration(0.5, delay: 0.5, options: [], animations: {
    }, completion: nil)
  • spring弹簧效果

  • 1
    2
    3
    4
    5
    UIView.animateWithDuration(0.33, delay: 0.0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.0, options: [], animations: {
    //code
    }, completion: {_ in
    //code
    })
    • 使用关键帧

    • 1
      2
      3
      UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.25, animations: {
      self.planeImage.center.x += 80.0
      self.planeImage.center.y -= 10.0 })
  1. 通过CGAffineTransformIdentity来将形变变回变形前的状态

  2. 1
    2
    3
    4
    CGAffineTransformConcat(
    CGAffineTransformMakeScale(1.0, 0.1), //缩放
    CGAffineTransformMakeTranslation(0.0, -auxLabelOffset)) } //位移
    //绑定多个形变

4.
CGAffineTransformMakeRotation来创建旋转形变

  1. 1
    2
    3
    4
    UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.25, animations: {
    self.planeImage.center.x += 80.0
    self.planeImage.center.y -= 10.0 })
    //通过添加关键帧来设置每个时间,上面的第一个参数为在前面关键帧动画中的百分比
  2. 可以修改layer的参数来实现静态动画。

  3. 在使用autolayout的时候,可以通过设置对应的参数后使用layoutIfNeed来进行创建动画

  4. 通过设置constraint.active = false来设置对应的约束是否生效

  5. 通过创建CAAnimate对象来创建对应的动画,然后将对应的layer使用setAnimation来设置对应的内容,key为后期删除或者修改的时候来设置对应的动画。

  6. 通过通过设置CABasicAnimated的fromValuetoValue还有duration来设置动画效果。

  7. 通过CABasicAnimation的keyPath来确定修改的属性。

  8. 通过设置beginTime来设置开始的时间一般为(CACurrentMediaTime()+doubleNmber)

  9. fillMode用来设置是否在动画谦和后来进行显示。默认为none,一般设置为KCAfillModeBoth(这样动画前和动画后的操作都不会出现)

  10. 使用Animatation的实际操作是,隐藏原有对象,然后创建新图片对象,然后操作图片对象,等到图片对象运动完,然后继续显示原对象。(为了不显示原对象,可以设置removeOnCompletion = false来进行设置,但是无法操作。)

  11. 使用delegate来确定animation开始和结束的时间,同时通过KVC来进行设置对应的参数。

  12. 通过layer.removeAnimationForKey来删除对应的Animation

  13. 通过AnimationGroup来异步加载所有动画效果,然后通过将CABasicAnimation加入到group中,从而使得动画异步,通过timingFunction来设置动画的速度。

  14. 通过CABasicAnimation的repeatCount来设置对应的重复次数,或者通过autoreverses = true来使得不断重复

  15. 通过设置speed来调整原来的速度倍速。2为2倍,由于speed的存在,duration的实际时间为除以speed后的时间

  16. 通过设置layer.speed后,实际上的速度是animation.Speed * view.layer.speed的速度,而且layer的speed作用于他的子layer

  17. UIKit(UIView.animationWithDuration)相对Core Animation更加强制。Core Animation可以设置更多参数,但是不能设置duration,duration会自行计算。

  18. CASpringAnimation如果设置了duration,如果duration小于实际时长的话,那么当到达duration的话,就会直接跳到结束。可以用duration = pulse.settlingDuration 来进行设置

  19. CASprintAnimation常见参数

  • damping为阻尼,默认为10
  • mass为,默认为1
    • stiffness,默认为100
    • initialivelocity,默认为0
  1. 使用CAKeyframeAnimation来代替animationWithKeyframe,通过values来设置每一帧的值,通过keyTimes来设置对应的转动的百分比时间。

  2. 通过NSValue(CGPoint())来将CGPoint转化为value,如果需要转换的为数组,那么使用map{NSValue(CGPoint:$0)}

  3. 通过对layer进行添加animation来发生形变,同时通过UIView.durationWithAnimation中的complete,从而更加方便的进行回调。从而不需要调用delegate

  4. 通过CAGradientLayer来创建渐变图层,左上为(0,0)右下为(1,1),color属性设置颜色,locations属性设置颜色位置

  5. 通过layer.mask = CALayer(),来设置对应的遮罩层,从而显示图像。

  6. 设置UIGraphicsBeginImageContextWithOptions中的scale为0,从而使得对应的图像分辨率为显示器的分辨率

  7. 通过使用CAShapeLayer来创建纯线的描绘,设置start和end,从而显示位置,为百分比。LineDashPattern的数组来设置哪几块绘制。

  8. kCAAnimationDiscrete 是一帧一帧,每一帧都要代码计算得到,而kCAAnimationPaced则是平滑的动画效果。

  9. 对于重复的动画,使用CAReplicatorLayer(),然后将需要重复的内容加入其中,同时设置instanceCount(重复个数),instanceTransform(重复的位置),instanceDelay(重复内容的动画延迟时间)

  10. 通过CATransform3DIdentity,从而获得对应的齐次矩阵,然后设置透视角度,identity.m34 = -1.0/1000,一般为250~2000,小于250,因为太大而形变,大于2000,基本平行,则没感觉。然后通过CATransform3dMakeXXXX这类函数进行形变,对矩阵进行设置,从而变形对应的对象。

  11. 设置layer的sublayerTransform属性,从而使得所有子layer都遵守这个透视图。

  12. 对于layer的animation的操作,不仅仅要给予layer的动画效果,还要设置最后的transform后的效果。

  13. 对于粒子效果,可以通过创建CAEmitterLayer来创建

  • emitterShape:设置粒子效果(发射方向
  • emitterPosition:喷射点
    • emitterSize:喷射区域大小
    • emitterCells:粒子种类
  1. CAEmitterCell来设置对应的粒子
  • contents:图片样式
  • birthRate:每秒产生个数
    • lifetime:每个生命周期
    • lifetimeRange:声明周期误差(正负)
    • yAcceleration:y轴加速度
    • xAcceleration:x轴加速度
    • velocity:初始速度
    • emissionLongitude:初始方向
    • velocityRange:速度误差值
    • emissionRange:方向误差值
    • redRange,greenRange,blueRange:红蓝绿的颜色类型
    • scale:缩放
    • scaleRange:缩放误差
    • scaleSpeed:缩放速度
    • alphaRange:透明度范围
  1. CGAffineTransformMakeScale(-1, 1)即将图片翻转

  2. 通过UIImageView.animationImages = [UIImages]来设置逐帧动画,animationDuration来设置动画时长,animationRepeatCount来设置重复次数,使用startAnimating来执行动画

  3. UIViewController转换的方法:

  4. 首先创建对应的动画对象,遵守UIViewControllerAnimatedTransitioning协议

    1. 在需要跳转的对应的VC上遵守UIViewControllerTransitioningDelegate协议
    2. 重写animationControllerForPresentedController方法,返回需要调用的动画对象,
    3. 在动画对象中transitionDuration,返回动画时间
    4. 在animateTransition设置动画效果。
    5. 基本思路是,fromVC刚开始被container所包裹(transitionContext),一开始的时候,toVC不存在,这个时候需要创建,并将对应的VC加入到container中,在duration结束后,transitionContext.completeTransition(true),从而告诉UIKit结束动画。
  5. UINavigationController跳转动画,

  6. 创建对应的动画对象,遵守UIViewControllerAnimatedTransitioning协议

    1. 在需要跳转的对应的VC上遵守UINavigationControllerTransitioningDelegate协议
    2. 在navigationController方法总返回跳转对象transition,同时设置oepration方向(PUSH还是POP
    3. 动画对象中设置duration时长和设置的动画。根据不同的operation的方向来决定动画效果。
    4. 在animationTransition设置点动画效果
    5. 同UIViewController
  7. 具有交互的跳转动画

  8. 动画对象继承UIPercentDrivenInteractiveTransition(不在使用继承NSObject)

    1. 其余和上相同

    2. 根据手势的不同状态,比如说recgnizer.state调用updateInteractiveTransition(progress)//更新图像,让界面进行重绘

      startInteractiveTransition(progress)//开始更新图像图像

  9. kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
    kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态
    kCAFillModeBackwards 这个和kCAFillModeForwards是相对的,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始.你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态
    kCAFillModeBoth 理解了上面两个,这个就很好理解了,这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.